package thread;

/**
 * 多线程并发安全问题
 * 但多个线程并操作同一临界资源,由于线程切换时机不确定,导致操作临界资源的顺序混乱,结果产生了不良影响
 *
 * 临界资源:操作该资源的完整过程同一时刻只能被单个线程进行;
 */
public class SyncDemo {
    public static void main(String[] args) {
        Table tab = new Table();
        Thread t1 = new Thread("甲"){
            public void run(){
                while(true){
                    int bean = tab.getBeans();
                    Thread.yield();//模拟没有到这没有时间了,选择让系统重新分配时间
                    System.out.println(getName()+":"+bean);
                }

            }
        };
        Thread t2 = new Thread("乙"){
            public void run(){
                while(true){
                    int bean = tab.getBeans();
                    Thread.yield();
                    System.out.println(getName()+":"+bean);
                }

            }
        };
        t1.start();
        t2.start();
    }
}
class Table{
    private int beans =20;
    /**
     * 但一个方法被synchronized关键字修饰后,此方法称为"同步方法";
     */
    public synchronized int getBeans(){//synchronized表示一个阻塞方法,当一个线程没走完时,其他线程也进不来;
        if(beans==0){
            throw new RuntimeException("没有豆子啦");
        }
        return beans--;
    }
}